package com.tgy.队列;

/***
 * @ClassName: ArrayQueue
 * @Description: 数组实现队列
 * @Auther: tanggy3
 * @Date: 14:37 2022/5/17
 * @version : V1.0
 */
public class ArrayQueueDemo {
    public static void main(String[] args) {
        ArrayQueue arrayQueue = new ArrayQueue(5);
        //接收用户输入
        boolean flag = true;
        while (flag) {
            System.out.println("请输入要操作的指令：");
            System.out.println("1.入队");
            System.out.println("2.出队");
            System.out.println("3.遍历");
            System.out.println("4.退出");
            System.out.println("==============================");
            int num = new java.util.Scanner(System.in).nextInt();
            switch (num) {
                case 1:
                    System.out.println("请输入要入队的数据：");
                    int data = new java.util.Scanner(System.in).nextInt();
                    arrayQueue.add(data);
                    break;
                case 2:
                    int one = arrayQueue.getOne();
                    System.out.println("出队的数据为：" + one);
                    break;
                case 3:
                    arrayQueue.showQueue();
                    break;
                case 4:
                    System.out.println("退出");
                    flag = false;
                    break;
                default:
                    System.out.println("输入错误，请重新输入");
                    break;
            }
        }
    }
}
//模拟队列
class ArrayQueue {
    private int maxSize;//队列最大容量
    private int front;//队列头
    private int rear;//队列尾
    private int[] arr;//数组,用于存放队列的数据

    //队列的构造器
    public ArrayQueue(int maxSize) {
        this.maxSize = maxSize;
        this.front = -1;//指向队列的头部，分析出front是指向队列头前的一个位置
        this.rear = -1;//指向队列尾。指向队列尾部的数据，即就是队列的最后一个数据
        this.arr = new int[maxSize];
    }

    //判断队列是否满
    public boolean isFull() {
        return rear + 1 == maxSize;
    }

    //判断队列是否为空
    public boolean isNull() {
        return front == rear;
    }

    //add data to queue 添加数据到队列
    public void add(int data) {
        if (isFull()) {
            System.out.println("队列已满，不能添加数据");
            return;
        }
        rear++;
        arr[rear] = data;
    }

    //delete data from queue 删除队列中的数据
    public int delete() {
        if (isNull()) {
            System.out.println("队列为空，不能删除数据");
            return -1;
        }
        front++;
        return arr[front];
    }

    //show queue 展示队列
    public void showQueue() {
        if (isNull()) {
            System.out.println("队列为空");
            return;
        }
        for (int i = front + 1; i <= rear; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

    //get one from queue 获取队列中的一个数据
    public int getOne() {
        if (isNull()) {
            throw new RuntimeException("队列为空，不能获取数据");
        }
        front++;
        return arr[front];
    }

    //get head from queue 获取队列中的头数据
    public int getHead() {
        if (isNull()) {
            throw new RuntimeException("队列为空，不能获取数据");
        }
        //只用显示不用取出，所以不需要移动front
        return arr[front + 1];
    }
}


